#pragma once
#include <string>

/* ---------------------------------------------------------------------------------------------
* A class that allows statement types to be created, where statement types are in queries such as:
* assign a
* var "a"
* procedure p
* while w
* if i
* etc
* ------------------------------------------------------------------------------------------- */

enum VAR_TYPE { Q_ANY_VALUE, 
				Q_ASSIGN,
				Q_CONSTANT,
				Q_PROCEDURE,
				Q_PROC_LITERAL,
				Q_PROGRAM_LINE,
				Q_STATEMENT,
				Q_STMT_LITERAL,
				Q_VARIABLE,
				Q_VAR_LITERAL,
				Q_WHILE,
				Q_IF };

class Synonym {
private:
	VAR_TYPE type; /**< The type of the synonym of enum VAR_TYPE */
	std::string variable; /**< The string form of the synonym */

public:
	/** Constructor
	 * Constructs an empty synonym
	 */
	Synonym();
	 
	/** Constructor
	 * Constructs a synonym of a type enum VAR_TYPE with a string identifier
	 * @param varType variable type
	 * @param var variable name
	 */
	Synonym(VAR_TYPE varType, std::string var);

	/** 
	 * Gets the type of the synonym
	 * @return the type of synonym
	 */
	VAR_TYPE getVarType();

	/** 
	 * Gets the string identifier of the result
	 * @return the string identifier
	 */
	std::string getVariable();
};